//
//  CZComposeViewController.swift
//  GZWeibo007
//
//  Created by Apple on 15/12/27.
//  Copyright © 2015年 Apple. All rights reserved.
//

import UIKit

import SVProgressHUD

class CZComposeViewController: UIViewController {
    
    // MARK: - 点击事件
    /// toolBar底部约束
    private var toolBarBottomCon: NSLayoutConstraint?
    
    /// 微博最大的长度
    private let maxTipLength = 25
    
    /// 照片选择器的view的底部约束
    private var photoSelectorViewBottomCon: NSLayoutConstraint?
    
    /// 关闭
    func close() {
        // 关闭提示
        SVProgressHUD.dismiss()
        
        // 将键盘退回去
//        textView.endEditing(true)
        // 取消第一响应者
        textView.resignFirstResponder()
        
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    /// 发送微博
    func sendStatus() {
        let text = textView.emoticonText()
        
        // 获取照片选择器的图片,获取第一张
        let image = photoSelectorVC.photos.first
        
        // 如果微博内容超出长度,提示用户
        if maxTipLength - text.characters.count < 0 {
            SVProgressHUD.showErrorWithStatus("微博内容超出长度")
            return
        }
        
        // 提示用户正在发送微博
        SVProgressHUD.showWithStatus("正在发送微博...")
        
        // 发送微博
        CZNetworkTool.sharedInstance.sendStatus(text, image: image) { (result, error) -> () in
            if error != nil {
                print("error: \(error)")
                SVProgressHUD.showInfoWithStatus("您的网络不给力")
                return
            }
            
            // 发送成功,关闭控制器
            SVProgressHUD.showSuccessWithStatus("发送微博成功...")
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), { () -> Void in
                self.close()
            })
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        prepareUI()
        
        // 将照片选择控制器管理起来,不然他modal出控制器后,自己会跑了
        // 只有管理起来的控制器才能接受到一些系统事件,例如屏幕的旋转
        self.addChildViewController(photoSelectorVC)
        self.addChildViewController(emoticonVC)
    
        // 添加通知,监听键盘的改变
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "willChangeFrame:", name: UIKeyboardWillChangeFrameNotification, object: nil)
        
        // 显示剩余文字长度
        tipLengthLabel.text = String(maxTipLength)
    }
    
    // 在用户看得到界面的时候来弹出键盘.
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        // 照片选择器没有出现的时候,就弹出键盘
        if photoSelectorViewBottomCon?.constant != 0 {
            // 说明照片选择器的view看不到
            // 弹出键盘
            textView.becomeFirstResponder()
        }
    }
    
    // dealloc
    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    
    /*
        notification: NSConcreteNotification 0x7f8e61cfa470 {name = UIKeyboardWillChangeFrameNotification; userInfo = {
                UIKeyboardAnimationCurveUserInfoKey = 7;
                UIKeyboardAnimationDurationUserInfoKey = "0.25";    // 动画时间
                UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {375, 258}}";
                UIKeyboardCenterBeginUserInfoKey = "NSPoint: {187.5, 796}";
                UIKeyboardCenterEndUserInfoKey = "NSPoint: {187.5, 538}";
                UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 667}, {375, 258}}";
                UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 409}, {375, 258}}";   // 键盘最终的位置
                UIKeyboardIsLocalUserInfoKey = 1;
        }}
    */
    // 键盘frame将要改变时的通知方法
    func willChangeFrame(notification: NSNotification) {
//        print("notification: \(notification)")
        // 获取动画时间
        let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! NSTimeInterval
        
        // 获取键盘的最终位置
        let frame = notification.userInfo![UIKeyboardFrameEndUserInfoKey]!.CGRectValue
        
        // 改变toolBar底部的约束
        toolBarBottomCon?.constant = -(UIScreen.mainScreen().bounds.height - frame.origin.y)
        UIView.animateWithDuration(duration) { () -> Void in
            self.view.layoutIfNeeded()
        }
    }
    
    private func prepareUI() {
        // 添加背景颜色,不然modal出来的时候,动画时可以看到后面的视图
        view.backgroundColor = UIColor.whiteColor()
        setupNavigationBar()
        setupTextView()
        setupPhotoBrowser()
        setupToolBar()
        // 作用:当控制器是导航控制器的子控制器时,（UIScrollView或子类）会自动往下滚动64
        // UIScrollView或子类必须是控制器的view,或者 UIScrollView或子类 是控制器的第一个子view
        
        setupTipLengthLabel()
    }
    
    /// 设置照片选择器
    private func setupPhotoBrowser() {
        let photoSelectorView = photoSelectorVC.view
        // 添加子控件
        view.addSubview(photoSelectorView)
        
        // 添加约束
        photoSelectorView.translatesAutoresizingMaskIntoConstraints = false
        
        // 水平填充父控件
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[psv]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["psv" : photoSelectorView]))
        
        // 垂直方向,高度是父控件的60%
        view.addConstraint(NSLayoutConstraint(item: photoSelectorView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: view.frame.height * 0.6))
        
        // 底部和父控件底部重合，往下移动照片选择器的高度
        photoSelectorViewBottomCon = NSLayoutConstraint(item: photoSelectorView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: view.frame.height * 0.6)
        view.addConstraint(photoSelectorViewBottomCon!)
    }
    
    /// 设置提示文字长度的label
    private func setupTipLengthLabel() {
        // 1.添加子控件
        view.addSubview(tipLengthLabel)
        
        // 2.添加约束
        tipLengthLabel.ff_AlignVertical(type: ff_AlignType.TopRight, referView: toolBar, size: nil, offset: CGPoint(x: -4, y: -4))
    }
    
    /// 设置导航栏
    private func setupNavigationBar() {
        // 左边
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: "close")
        
        // 右边
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "发送", style: UIBarButtonItemStyle.Plain, target: self, action: "sendStatus")
        // 让右边的按钮不可用
        navigationItem.rightBarButtonItem?.enabled = false
        
        setupNavTitle()
    }
    
    /// 设置导航栏标题
    private func setupNavTitle() {
        let prefix = "发微博"

        if let name = CZUserAccount.loadUserAccount()?.screen_name {
            // 获取到用户的名称,显示发微博+用户名
            // \n表示换行
            let text = prefix + "\n" + name
            
            // 创建Label显示文本
            let label = UILabel()
            label.numberOfLines = 0
            label.textColor = UIColor.blackColor()
            label.textAlignment = NSTextAlignment.Center
            label.font = UIFont.systemFontOfSize(14)
            
//            label.text = text
            
            // 使用属性文本来设置用户名称的颜色和大小
            let attrText = NSMutableAttributedString(string: text)
            
            // 获取用户名称在 text 里面的范围
            let nameRange = (text as NSString).rangeOfString(name)
            
            // 设置用户名称颜色
            // name: 要设置的属性  NSForeg
            // value: 要设置的属性值
            attrText.addAttribute(NSForegroundColorAttributeName, value: UIColor.lightGrayColor(), range: nameRange)
            
            // 设置用户名的字体大小
            attrText.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(11), range: nameRange)
            
            // 设置label的属性文本
            label.attributedText = attrText
            
            // label适应大小
            label.sizeToFit()
            
            navigationItem.titleView = label
        } else {
            // 如果没有获取到用户的名称,直接显示发微博
            navigationItem.title = prefix
        }
    }
    
    /// 设置toolBar
    private func setupToolBar() {
        // 添加到view里面
        view.addSubview(toolBar)
        
        // 设置约束,内部左下角
        // UIBarButtonItem
        let cons = toolBar.ff_AlignInner(type: ff_AlignType.BottomLeft, referView: view, size: CGSize(width: UIScreen.mainScreen().bounds.width, height: 44))
        
        // 取出toolBar底部约束
        toolBarBottomCon = toolBar.ff_Constraint(cons, attribute: NSLayoutAttribute.Bottom)
        
        // 每个item对应的图片名称, 数组里面有5个字典 imageName 对应的value就是要显示的图片
        let itemSettings = [["imageName": "compose_toolbar_picture", "action": "picture"],
            ["imageName": "compose_mentionbutton_background", "action": "mention"],
            ["imageName": "compose_trendbutton_background", "action": "trend"],
            ["imageName": "compose_emoticonbutton_background", "action": "emoticon"],
            ["imageName": "compose_addbutton_background", "action": "add"]]
        
        var items = [UIBarButtonItem]()
        
        // 记录按钮是第几个,作为按钮的tag
        var index = 0
        
        // 遍历数组,获取图片的名称
        for dict in itemSettings {
            let imageName = dict["imageName"]!
            let action = dict["action"]!
            
            // 创建UIBarButtonItem
            let item = UIBarButtonItem(imageName: imageName)
            
            // 给item里面的按钮添加点击事件
            let button = item.customView as! UIButton
            // action: 如果是字符串,可以直接使用,如果是一个变量或常量,需要使用Selector
            button.addTarget(self, action: Selector(action), forControlEvents: UIControlEvents.TouchUpInside)
            button.tag = index
            
            // 不要直接appent,因为 toolBar.items 没有值
//            toolBar.items?.append(newElement: Element)
            items.append(item)
            
            // 添加弹簧
            let flexibleSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
            items.append(flexibleSpace)
            
            index++
        }
        
        // 移除最后一根弹簧
        items.removeLast()
        
        toolBar.items = items
    }
    
    /// 设置textView
    private func setupTextView() {
        // 添加textView的代理,来监听文字的改变
        textView.delegate = self
        
        // 添加子控件
        view.addSubview(textView)
        
        // 添加约束,填充父控件
        textView.ff_Fill(view)
    }
    
    // MARK: - toolBar点击事件
    func picture() {
        // 让照片选择器的view回到上面来
        photoSelectorViewBottomCon?.constant = 0
        
        // 把键盘退下
        textView.resignFirstResponder()
        
        // 动画
        UIView.animateWithDuration(0.25) { () -> Void in
            self.view.layoutIfNeeded()
        }
    }
    
    func trend() {
        print("#")
    }
    
    func mention() {
        print("@")
    }
    
    /*
        textView弹出键盘之前:
            1.如果inputView == nil,会弹系统的键盘
            2.如果inputView != nil,弹对应的键盘
    */
    /// 切换键盘
    func emoticon() {
        print("textView.inputView: \(textView.inputView)")
        // 将键盘退回,如果退出键盘和弹出键盘事件相差很短,不会有退回去和弹出来的动画
        textView.resignFirstResponder()
        
        // 延迟0.25在弹出键盘
        // 单位毫秒USEC_PER_SEC
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(250 * USEC_PER_SEC)), dispatch_get_main_queue()) { () -> Void in
            // 如果使用的是系统键盘,就切换到我们的键盘,如果使用的是我们的键盘就切换到系统
            self.textView.inputView = self.textView.inputView == nil ? self.emoticonVC.view : nil
            
            // 再次弹出键盘
            self.textView.becomeFirstResponder()
        }
    }
    
    func add() {
        print("加号")
    }
    
    // MARK: - 懒加载
    private lazy var toolBar: UIToolbar = {
        let toolBar = UIToolbar()
        
        // 设置背景
        toolBar.backgroundColor = UIColor(white: 0.8, alpha: 1)
        
        return toolBar
    }()
    
    /*
        iOS中可以让用户输入的控件
            1.TextField
                1.只能输入一行
                2.有占位文本
                3.继承自UIControl不能滚动
    
            2.TextView
                1.可以输入多行
                2.没有占位文本
                3.继承自scrollView可以滚动
    */
    private lazy var textView: CZPlaceholderTextView = {
        let textView = CZPlaceholderTextView()
        
        // 设置scrollView顶部有64的内边距,会将内容往下64
        textView.backgroundColor = UIColor.whiteColor()
        textView.font = UIFont.systemFontOfSize(18)
        textView.alwaysBounceVertical = true
        textView.placeholderText = "分享新鲜事..."
        
        // 拖动scrollView时自动关闭
        textView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag
        
        return textView
    }()
    
    /// 剩余文字数量的label
    private lazy var tipLengthLabel: UILabel = {
        let label = UILabel()
        
        // 设置字体
        label.font = UIFont.systemFontOfSize(13)
        
        // 设置颜色
        label.textColor = UIColor.lightGrayColor()
        
        return label
    }()
    
    /// 表情键盘控制器
    private lazy var emoticonVC: CZEmoticonViewController = CZEmoticonViewController(textView: self.textView)
    
    /// 照片选择控制器
    private lazy var photoSelectorVC: CZPhotoSelectorController = CZPhotoSelectorController()
}

extension CZComposeViewController: UITextViewDelegate {
    func textViewDidChange(textView: UITextView) {
        // 设置导航栏右边按钮的可用和不可用
        navigationItem.rightBarButtonItem?.enabled = textView.hasText()
        
        // 获取textView现有的文字数量
        let count = textView.emoticonText().characters.count
        
        // 用最大文字数量 - 现有文字数量
        let length = maxTipLength - count
        
        // 设置剩余文字数量
        tipLengthLabel.text = String(length)
        
        // 如果剩余数量小于0显示红色,否则显示灰色
        tipLengthLabel.textColor = length < 0 ? UIColor.redColor() : UIColor.lightGrayColor()
    }
}